﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Vbe.Interop;
using Microsoft.Office.Core;
using 枸杞VBE插件.Attributes;
using Extensibility;
using System.Runtime.InteropServices;
using 枸杞VBE插件.Interfaces;
using 枸杞VBE插件.Indent;

namespace 枸杞VBE插件
{
    internal class VBEHelper : IDisposable, Rougamo.IRougamo<LogAttribute>
    {
        private readonly IDTExtensibility2 extensibility;
        private readonly VBE VBE对象;
        private readonly AddIn Addin;
        private CommandBar 主菜单栏;
        private CommandBar 右键菜单;
        private readonly IIndenter indenter;

        //internal 键盘鼠标钩子 键盘钩子;
        //private IntPtr MDIClient句柄;

        //internal Dictionary<string, 菜单栏控件> 控件字典;
        //internal Lazy<窗体.代码库窗体> 代码库窗体;
        //internal Lazy<破解工程密码> 破解工程密码;
        //internal Lazy<Indenter> Indenter;
        //private int 标签号;

        internal VBEHelper(IDTExtensibility2 extAddin, VBE Application, AddIn addinWrapper)
        {
            extensibility = extAddin;
            VBE对象 = Application;
            Addin = addinWrapper;
            indenter = new Indenter(VBE对象);
        }

        internal void Initialize()
        {
            //todo: 初始化
            //代码库窗体 = new Lazy<窗体.代码库窗体>();
            //破解工程密码 = new Lazy<破解工程密码>();
            //Indenter = new Lazy<Indenter>(() => new Indenter(VBE对象));
            //MDIClient句柄 = WinApi.FindWindowEx((IntPtr)VBE对象.MainWindow.HWnd, IntPtr.Zero, "MDIClient", "");
            //键盘钩子 = new 键盘鼠标钩子();
            //控件字典 = new Dictionary<string, 菜单栏控件>();
            //Db = CreateDatabase();// new LiteDB.LiteDatabase($"Filename ={数据库地址}; Password = 1234");
            生成右键菜单();
            生成主菜单栏();
            主菜单生成基础功能按钮();
            主菜单添加一级菜单();
            主菜单添加次级控件();
        }

        internal void 生成右键菜单()
        {
            右键菜单 = VBE对象.CommandBars["Code Window"];
            右键菜单.AddButton("格式化当前过程", 3495, indenter.IndentCurrentProcedure).Move(null, 1);
            右键菜单.AddButton("格式化当前模块", 3495, indenter.IndentCurrentModule).Move(null, 1);
            右键菜单.AddButton("格式化当前工程", 3495, indenter.IndentCurrentProject).Move(null, 1);
            右键菜单.AddButton("删除空行", 3411, VBE对象.ActiveCodePane.删除空行).Move(null, 1).BeginGroup = true;
            //菜单栏控件 剪切控件 = 右键菜单.Controls["剪切(&T)"];
            //剪切控件.BeginGroup = true;
            //右键菜单.Controls[3].BeginGroup = true;
        }

        internal void 生成主菜单栏()
        {
            if (主菜单栏 == null)
            {
                主菜单栏 = VBE对象.CommandBars.Add("枸杞VBE工具栏", MsoBarPosition.msoBarTop, null, true);
                //控件字典["枸杞VBE工具栏"] = null;
                主菜单栏.Enabled = true;
                主菜单栏.Visible = true;
            }
        }

        internal void 主菜单生成基础功能按钮()
        {
            //主菜单栏.AddButton("代码库", 1, () => { }).BeginGroup = true;

            //CommandBarPopup 选项菜单 = 主菜单栏.Controls.添加菜单("选项");
            //var cs = 选项菜单.Controls;
            //cs.添加按钮("格式化当前过程", 1, 格式化当前过程, @"选项\格式化当前过程");
            //cs.添加按钮("格式化当前模块", 1, 格式化当前模块, @"选项\格式化当前模块");
            //cs.添加按钮("格式化当前工程", 1, 格式化当前工程, @"选项\格式化当前工程");
            //cs.添加按钮("无视密码", 1, 无视工程密码, @"选项\无视密码");
            //cs.添加按钮("恢复密码", 1, 恢复密码, @"选项\恢复密码");
            //cs.添加按钮("打开Logs文件夹", 1, 打开logs文件夹, @"选项\打开logs文件夹");
            //cs.添加按钮("测试引用", 1, (菜单栏按钮 c, ref bool _) =>
            //{
            //    VBE对象.ActiveVBProject.References.AddFromFile(Path.Combine(配置.插件路径, "枸杞VBE插件.tlb"));
            //    VBE对象.ActiveVBProject.VBComponents
            //    .Add(模块类型.vbext_ct_StdModule)
            //    .CodeModule
            //    .AddFromString("Sub test()\nDim obj As 枸杞VBE插件.VBEAddin\nSet obj = Application.VBE.AddIns(\"枸杞VBE插件\").Object\nobj.msg\nEnd Sub");
            //}, @"选项\测试引用");
        }

        internal void 主菜单添加一级菜单()
        {
            try
            {
            }
            catch
            {
                throw;
            }

            // 查询一级菜单().ForEach(代码 => 生成控件(代码.关键字, 控件类型.菜单));
        }

        internal void 主菜单添加次级控件()
        {
            // 查询次级控件().ForEach(a => 生成控件(a.关键字, a.计数 > 1 ? 控件类型.菜单 : 控件类型.按钮));
        }

        internal void 删除空行()
        {
            VBE对象.ActiveCodePane.删除空行();
        }

        #region 实现IDisposable接口

        private bool disposedValue;

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    // TODO: 释放托管状态(托管对象)
                }

                // TODO: 释放未托管的资源(未托管的对象)并重写终结器
                // TODO: 将大型字段设置为 null
                disposedValue = true;
            }
        }

        // // TODO: 仅当“Dispose(bool disposing)”拥有用于释放未托管资源的代码时才替代终结器
        // ~VBEHelper()
        // {
        //     // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
        //     Dispose(disposing: false);
        // }

        public void Dispose()
        {
            // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
            Dispose(disposing: true);
            GC.SuppressFinalize(this);
        }

        #endregion 实现IDisposable接口

        #region 单例模式实现静态实例

        //private static VBEHelper? _Instance;

        //internal static VBEHelper Instance
        //{
        //    get
        //    {
        //        if (_Instance == null || _Instance.disposedValue)
        //        {
        //            _Instance = new();
        //        }
        //        return _Instance;
        //    }
        //}

        //private VBEHelper()//初始化
        //{
        //}

        #endregion 单例模式实现静态实例
    }
}